package com.isyscore.service.admin.impl;

import cn.hutool.core.bean.BeanUtil;
import com.isyscore.dto.MenuTreeDto;
import com.isyscore.entity.admin.SysMenu;
import com.isyscore.mapper.admin.SysMenuMapper;
import com.isyscore.model.sys.menu.query.MenuQueryReq;
import com.isyscore.service.admin.SysMenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.swing.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 菜单权限表 服务实现类
 * </p>
 *
 * @author LGL
 * @since 2024年10月25日
 */
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {


    @Override
    public List<MenuTreeDto> getMenusByUserId(Long userId) {
        return convertTree(baseMapper.getMenusByUserId(userId));
    }

    /**
     * 获取所有的菜单树数据
     *
     * @return
     */
    @Override
    public List<MenuTreeDto> getMenuDtos(MenuQueryReq queryReq) {

        return convertTree(baseMapper.getAllMenus(queryReq));
    }

    private List<MenuTreeDto> convertTree(List<SysMenu> menus) {
        // 第一步：将所有菜单转换为 MenuTreeDto 并存入 Map
        Map<Long, MenuTreeDto> menuMap = menus.stream()
                .map(menu -> {
                    // 将 SysMenu 转换为 MenuTreeDto
                    MenuTreeDto dto = BeanUtil.toBean(menu, MenuTreeDto.class);
                    // 初始化子节点列表
                    dto.setChildren(new ArrayList<>());
                    return dto;
                })
                // 收集为 Map，键为菜单ID，值为对应的 MenuTreeDto 对象
                .collect(Collectors.toMap(MenuTreeDto::getMenuId, dto -> dto));

        // 第二步：构建树形结构并返回根节点列表
        return menuMap.values().stream()
                .filter(menu -> {
                    // 对于非根节点（parentId != 0）
                    if (menu.getParentId() != 0) {
                        // 查找父节点
                        MenuTreeDto parent = menuMap.get(menu.getParentId());
                        // 如果父节点存在，将当前节点添加到父节点的子节点列表中
                        if (parent != null) {
                            parent.getChildren().add(menu);
                            return false;
                        }
                        // 过滤掉非根节点
                        return true;
                    }
                    // 保留根节点（parentId == 0）
                    return true;
                })
                // 收集根节点到 List
                .collect(Collectors.toList());
    }
}
